home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.4)
-
- '''Parse tree transformation module.
-
- Transforms Python source code into an abstract syntax tree (AST)
- defined in the ast module.
-
- The simplest ways to invoke this module are via parse and parseFile.
- parse(buf) -> AST
- parseFile(path) -> AST
- '''
- from compiler.ast import *
- import parser
- import symbol
- import token
- import sys
-
- class WalkerError(StandardError):
- pass
-
- from consts import CO_VARARGS, CO_VARKEYWORDS
- from consts import OP_ASSIGN, OP_DELETE, OP_APPLY
-
- def parseFile(path):
- f = open(path, 'U')
- src = f.read() + '\n'
- f.close()
- return parse(src)
-
-
- def parse(buf, mode = 'exec'):
- if mode == 'exec' or mode == 'single':
- return Transformer().parsesuite(buf)
- elif mode == 'eval':
- return Transformer().parseexpr(buf)
- else:
- raise ValueError("compile() arg 3 must be 'exec' or 'eval' or 'single'")
-
-
- def asList(nodes):
- l = []
- for item in nodes:
- if hasattr(item, 'asList'):
- l.append(item.asList())
- continue
- if type(item) is type((None, None)):
- l.append(tuple(asList(item)))
- continue
- if type(item) is type([]):
- l.append(asList(item))
- continue
- l.append(item)
-
- return l
-
-
- def extractLineNo(ast):
- if not isinstance(ast[1], tuple):
- return ast[2]
-
- for child in ast[1:]:
- if isinstance(child, tuple):
- lineno = extractLineNo(child)
- if lineno is not None:
- return lineno
-
- lineno is not None
-
-
-
- def Node(*args):
- kind = args[0]
- if nodes.has_key(kind):
-
- try:
- return nodes[kind](*args[1:])
- except TypeError:
- print nodes[kind], len(args), args
- raise
- except:
- None<EXCEPTION MATCH>TypeError
-
-
- None<EXCEPTION MATCH>TypeError
- raise WalkerError, "Can't find appropriate Node type: %s" % str(args)
-
-
- class Transformer:
- '''Utility object for transforming Python parse trees.
-
- Exposes the following methods:
- tree = transform(ast_tree)
- tree = parsesuite(text)
- tree = parseexpr(text)
- tree = parsefile(fileob | filename)
- '''
-
- def __init__(self):
- self._dispatch = { }
- for value, name in symbol.sym_name.items():
- if hasattr(self, name):
- self._dispatch[value] = getattr(self, name)
- continue
-
- self._dispatch[token.NEWLINE] = self.com_NEWLINE
- self._atom_dispatch = {
- token.LPAR: self.atom_lpar,
- token.LSQB: self.atom_lsqb,
- token.LBRACE: self.atom_lbrace,
- token.BACKQUOTE: self.atom_backquote,
- token.NUMBER: self.atom_number,
- token.STRING: self.atom_string,
- token.NAME: self.atom_name }
- self.encoding = None
-
-
- def transform(self, tree):
- '''Transform an AST into a modified parse tree.'''
- if not isinstance(tree, tuple) or isinstance(tree, list):
- tree = parser.ast2tuple(tree, line_info = 1)
-
- return self.compile_node(tree)
-
-
- def parsesuite(self, text):
- '''Return a modified parse tree for the given suite text.'''
- return self.transform(parser.suite(text))
-
-
- def parseexpr(self, text):
- '''Return a modified parse tree for the given expression text.'''
- return self.transform(parser.expr(text))
-
-
- def parsefile(self, file):
- '''Return a modified parse tree for the contents of the given file.'''
- if type(file) == type(''):
- file = open(file)
-
- return self.parsesuite(file.read())
-
-
- def compile_node(self, node):
- n = node[0]
- if n == symbol.encoding_decl:
- self.encoding = node[2]
- node = node[1]
- n = node[0]
-
- if n == symbol.single_input:
- return self.single_input(node[1:])
-
- if n == symbol.file_input:
- return self.file_input(node[1:])
-
- if n == symbol.eval_input:
- return self.eval_input(node[1:])
-
- if n == symbol.lambdef:
- return self.lambdef(node[1:])
-
- if n == symbol.funcdef:
- return self.funcdef(node[1:])
-
- if n == symbol.classdef:
- return self.classdef(node[1:])
-
- raise WalkerError, ('unexpected node type', n)
-
-
- def single_input(self, node):
- n = node[0][0]
- if n != token.NEWLINE:
- return self.com_stmt(node[0])
-
- return Pass()
-
-
- def file_input(self, nodelist):
- doc = self.get_docstring(nodelist, symbol.file_input)
- if doc is not None:
- i = 1
- else:
- i = 0
- stmts = []
- for node in nodelist[i:]:
- if node[0] != token.ENDMARKER and node[0] != token.NEWLINE:
- self.com_append_stmt(stmts, node)
- continue
-
- return Module(doc, Stmt(stmts))
-
-
- def eval_input(self, nodelist):
- return Expression(self.com_node(nodelist[0]))
-
-
- def decorator_name(self, nodelist):
- listlen = len(nodelist)
- if not listlen >= 1 or listlen % 2 == 1:
- raise AssertionError
- item = self.atom_name(nodelist)
- i = 1
- while i < listlen:
- if not nodelist[i][0] == token.DOT:
- raise AssertionError
- if not nodelist[i + 1][0] == token.NAME:
- raise AssertionError
- item = Getattr(item, nodelist[i + 1][1])
- i += 2
- return item
-
-
- def decorator(self, nodelist):
- if not len(nodelist) in (3, 5, 6):
- raise AssertionError
- if not nodelist[0][0] == token.AT:
- raise AssertionError
- if not nodelist[-1][0] == token.NEWLINE:
- raise AssertionError
- if not nodelist[1][0] == symbol.dotted_name:
- raise AssertionError
- funcname = self.decorator_name(nodelist[1][1:])
- if len(nodelist) > 3:
- if not nodelist[2][0] == token.LPAR:
- raise AssertionError
- expr = self.com_call_function(funcname, nodelist[3])
- else:
- expr = funcname
- return expr
-
-
- def decorators(self, nodelist):
- items = []
- for dec_nodelist in nodelist:
- if not dec_nodelist[0] == symbol.decorator:
- raise AssertionError
- items.append(self.decorator(dec_nodelist[1:]))
-
- return Decorators(items)
-
-
- def funcdef(self, nodelist):
- if len(nodelist) == 6:
- if not nodelist[0][0] == symbol.decorators:
- raise AssertionError
- decorators = self.decorators(nodelist[0][1:])
- elif not len(nodelist) == 5:
- raise AssertionError
- decorators = None
- lineno = nodelist[-4][2]
- name = nodelist[-4][1]
- args = nodelist[-3][2]
- if args[0] == symbol.varargslist:
- (names, defaults, flags) = self.com_arglist(args[1:])
- else:
- names = defaults = ()
- flags = 0
- doc = self.get_docstring(nodelist[-1])
- code = self.com_node(nodelist[-1])
- if doc is not None:
- if not isinstance(code, Stmt):
- raise AssertionError
- if not isinstance(code.nodes[0], Discard):
- raise AssertionError
- del code.nodes[0]
-
- return Function(decorators, name, names, defaults, flags, doc, code, lineno = lineno)
-
-
- def lambdef(self, nodelist):
- if nodelist[2][0] == symbol.varargslist:
- (names, defaults, flags) = self.com_arglist(nodelist[2][1:])
- else:
- names = defaults = ()
- flags = 0
- code = self.com_node(nodelist[-1])
- return Lambda(names, defaults, flags, code, lineno = nodelist[1][2])
-
-
- def classdef(self, nodelist):
- name = nodelist[1][1]
- doc = self.get_docstring(nodelist[-1])
- if nodelist[2][0] == token.COLON:
- bases = []
- else:
- bases = self.com_bases(nodelist[3])
- code = self.com_node(nodelist[-1])
- if doc is not None:
- if not isinstance(code, Stmt):
- raise AssertionError
- if not isinstance(code.nodes[0], Discard):
- raise AssertionError
- del code.nodes[0]
-
- return Class(name, bases, doc, code, lineno = nodelist[1][2])
-
-
- def stmt(self, nodelist):
- return self.com_stmt(nodelist[0])
-
- small_stmt = stmt
- flow_stmt = stmt
- compound_stmt = stmt
-
- def simple_stmt(self, nodelist):
- stmts = []
- for i in range(0, len(nodelist), 2):
- self.com_append_stmt(stmts, nodelist[i])
-
- return Stmt(stmts)
-
-
- def parameters(self, nodelist):
- raise WalkerError
-
-
- def varargslist(self, nodelist):
- raise WalkerError
-
-
- def fpdef(self, nodelist):
- raise WalkerError
-
-
- def fplist(self, nodelist):
- raise WalkerError
-
-
- def dotted_name(self, nodelist):
- raise WalkerError
-
-
- def comp_op(self, nodelist):
- raise WalkerError
-
-
- def trailer(self, nodelist):
- raise WalkerError
-
-
- def sliceop(self, nodelist):
- raise WalkerError
-
-
- def argument(self, nodelist):
- raise WalkerError
-
-
- def expr_stmt(self, nodelist):
- en = nodelist[-1]
- exprNode = self.lookup_node(en)(en[1:])
- if len(nodelist) == 1:
- return Discard(exprNode, lineno = exprNode.lineno)
-
- if nodelist[1][0] == token.EQUAL:
- nodesl = []
- for i in range(0, len(nodelist) - 2, 2):
- nodesl.append(self.com_assign(nodelist[i], OP_ASSIGN))
-
- return Assign(nodesl, exprNode, lineno = nodelist[1][2])
- else:
- lval = self.com_augassign(nodelist[0])
- op = self.com_augassign_op(nodelist[1])
- return AugAssign(lval, op[1], exprNode, lineno = op[2])
- raise WalkerError, "can't get here"
-
-
- def print_stmt(self, nodelist):
- items = []
- if len(nodelist) == 1:
- start = 1
- dest = None
- elif nodelist[1][0] == token.RIGHTSHIFT:
- if not len(nodelist) == 3 and nodelist[3][0] == token.COMMA:
- raise AssertionError
- dest = self.com_node(nodelist[2])
- start = 4
- else:
- dest = None
- start = 1
- for i in range(start, len(nodelist), 2):
- items.append(self.com_node(nodelist[i]))
-
- if nodelist[-1][0] == token.COMMA:
- return Print(items, dest, lineno = nodelist[0][2])
-
- return Printnl(items, dest, lineno = nodelist[0][2])
-
-
- def del_stmt(self, nodelist):
- return self.com_assign(nodelist[1], OP_DELETE)
-
-
- def pass_stmt(self, nodelist):
- return Pass(lineno = nodelist[0][2])
-
-
- def break_stmt(self, nodelist):
- return Break(lineno = nodelist[0][2])
-
-
- def continue_stmt(self, nodelist):
- return Continue(lineno = nodelist[0][2])
-
-
- def return_stmt(self, nodelist):
- if len(nodelist) < 2:
- return Return(Const(None), lineno = nodelist[0][2])
-
- return Return(self.com_node(nodelist[1]), lineno = nodelist[0][2])
-
-
- def yield_stmt(self, nodelist):
- return Yield(self.com_node(nodelist[1]), lineno = nodelist[0][2])
-
-
- def raise_stmt(self, nodelist):
- if len(nodelist) > 5:
- expr3 = self.com_node(nodelist[5])
- else:
- expr3 = None
- if len(nodelist) > 3:
- expr2 = self.com_node(nodelist[3])
- else:
- expr2 = None
- if len(nodelist) > 1:
- expr1 = self.com_node(nodelist[1])
- else:
- expr1 = None
- return Raise(expr1, expr2, expr3, lineno = nodelist[0][2])
-
-
- def import_stmt(self, nodelist):
- if not len(nodelist) == 1:
- raise AssertionError
- return self.com_node(nodelist[0])
-
-
- def import_name(self, nodelist):
- return Import(self.com_dotted_as_names(nodelist[1]), lineno = nodelist[0][2])
-
-
- def import_from(self, nodelist):
- if not nodelist[0][1] == 'from':
- raise AssertionError
- if not nodelist[1][0] == symbol.dotted_name:
- raise AssertionError
- if not nodelist[2][1] == 'import':
- raise AssertionError
- fromname = self.com_dotted_name(nodelist[1])
- if nodelist[3][0] == token.STAR:
- return From(fromname, [
- ('*', None)], lineno = nodelist[0][2])
- else:
- node = nodelist[3 + (nodelist[3][0] == token.LPAR)]
- return From(fromname, self.com_import_as_names(node), lineno = nodelist[0][2])
-
-
- def global_stmt(self, nodelist):
- names = []
- for i in range(1, len(nodelist), 2):
- names.append(nodelist[i][1])
-
- return Global(names, lineno = nodelist[0][2])
-
-
- def exec_stmt(self, nodelist):
- expr1 = self.com_node(nodelist[1])
- if len(nodelist) >= 4:
- expr2 = self.com_node(nodelist[3])
- if len(nodelist) >= 6:
- expr3 = self.com_node(nodelist[5])
- else:
- expr3 = None
- else:
- expr2 = None
- expr3 = None
- return Exec(expr1, expr2, expr3, lineno = nodelist[0][2])
-
-
- def assert_stmt(self, nodelist):
- expr1 = self.com_node(nodelist[1])
- if len(nodelist) == 4:
- expr2 = self.com_node(nodelist[3])
- else:
- expr2 = None
- return Assert(expr1, expr2, lineno = nodelist[0][2])
-
-
- def if_stmt(self, nodelist):
- tests = []
- for i in range(0, len(nodelist) - 3, 4):
- testNode = self.com_node(nodelist[i + 1])
- suiteNode = self.com_node(nodelist[i + 3])
- tests.append((testNode, suiteNode))
-
- if len(nodelist) % 4 == 3:
- elseNode = self.com_node(nodelist[-1])
- else:
- elseNode = None
- return If(tests, elseNode, lineno = nodelist[0][2])
-
-
- def while_stmt(self, nodelist):
- testNode = self.com_node(nodelist[1])
- bodyNode = self.com_node(nodelist[3])
- if len(nodelist) > 4:
- elseNode = self.com_node(nodelist[6])
- else:
- elseNode = None
- return While(testNode, bodyNode, elseNode, lineno = nodelist[0][2])
-
-
- def for_stmt(self, nodelist):
- assignNode = self.com_assign(nodelist[1], OP_ASSIGN)
- listNode = self.com_node(nodelist[3])
- bodyNode = self.com_node(nodelist[5])
- if len(nodelist) > 8:
- elseNode = self.com_node(nodelist[8])
- else:
- elseNode = None
- return For(assignNode, listNode, bodyNode, elseNode, lineno = nodelist[0][2])
-
-
- def try_stmt(self, nodelist):
- if nodelist[3][0] != symbol.except_clause:
- return self.com_try_finally(nodelist)
-
- return self.com_try_except(nodelist)
-
-
- def suite(self, nodelist):
- if len(nodelist) == 1:
- return self.com_stmt(nodelist[0])
-
- stmts = []
- for node in nodelist:
- if node[0] == symbol.stmt:
- self.com_append_stmt(stmts, node)
- continue
-
- return Stmt(stmts)
-
-
- def testlist(self, nodelist):
- return self.com_binary(Tuple, nodelist)
-
- testlist_safe = testlist
- testlist1 = testlist
- exprlist = testlist
-
- def testlist_gexp(self, nodelist):
- if len(nodelist) == 2 and nodelist[1][0] == symbol.gen_for:
- test = self.com_node(nodelist[0])
- return self.com_generator_expression(test, nodelist[1])
-
- return self.testlist(nodelist)
-
-
- def test(self, nodelist):
- if len(nodelist) == 1 and nodelist[0][0] == symbol.lambdef:
- return self.lambdef(nodelist[0])
-
- return self.com_binary(Or, nodelist)
-
-
- def and_test(self, nodelist):
- return self.com_binary(And, nodelist)
-
-
- def not_test(self, nodelist):
- result = self.com_node(nodelist[-1])
- if len(nodelist) == 2:
- return Not(result, lineno = nodelist[0][2])
-
- return result
-
-
- def comparison(self, nodelist):
- node = self.com_node(nodelist[0])
- if len(nodelist) == 1:
- return node
-
- results = []
- for i in range(2, len(nodelist), 2):
- nl = nodelist[i - 1]
- n = nl[1]
- if n[0] == token.NAME:
- type = n[1]
- if len(nl) == 3:
- if type == 'not':
- type = 'not in'
- else:
- type = 'is not'
-
- else:
- type = _cmp_types[n[0]]
- lineno = nl[1][2]
- results.append((type, self.com_node(nodelist[i])))
-
- return Compare(node, results, lineno = lineno)
-
-
- def expr(self, nodelist):
- return self.com_binary(Bitor, nodelist)
-
-
- def xor_expr(self, nodelist):
- return self.com_binary(Bitxor, nodelist)
-
-
- def and_expr(self, nodelist):
- return self.com_binary(Bitand, nodelist)
-
-
- def shift_expr(self, nodelist):
- node = self.com_node(nodelist[0])
- for i in range(2, len(nodelist), 2):
- right = self.com_node(nodelist[i])
- if nodelist[i - 1][0] == token.LEFTSHIFT:
- node = LeftShift([
- node,
- right], lineno = nodelist[1][2])
- continue
- if nodelist[i - 1][0] == token.RIGHTSHIFT:
- node = RightShift([
- node,
- right], lineno = nodelist[1][2])
- continue
- raise ValueError, 'unexpected token: %s' % nodelist[i - 1][0]
-
- return node
-
-
- def arith_expr(self, nodelist):
- node = self.com_node(nodelist[0])
- for i in range(2, len(nodelist), 2):
- right = self.com_node(nodelist[i])
- if nodelist[i - 1][0] == token.PLUS:
- node = Add([
- node,
- right], lineno = nodelist[1][2])
- continue
- if nodelist[i - 1][0] == token.MINUS:
- node = Sub([
- node,
- right], lineno = nodelist[1][2])
- continue
- raise ValueError, 'unexpected token: %s' % nodelist[i - 1][0]
-
- return node
-
-
- def term(self, nodelist):
- node = self.com_node(nodelist[0])
- for i in range(2, len(nodelist), 2):
- right = self.com_node(nodelist[i])
- t = nodelist[i - 1][0]
- if t == token.STAR:
- node = Mul([
- node,
- right])
- elif t == token.SLASH:
- node = Div([
- node,
- right])
- elif t == token.PERCENT:
- node = Mod([
- node,
- right])
- elif t == token.DOUBLESLASH:
- node = FloorDiv([
- node,
- right])
- else:
- raise ValueError, 'unexpected token: %s' % t
- node.lineno = nodelist[1][2]
-
- return node
-
-
- def factor(self, nodelist):
- elt = nodelist[0]
- t = elt[0]
- node = self.lookup_node(nodelist[-1])(nodelist[-1][1:])
- if t == token.PLUS:
- return UnaryAdd(node, lineno = elt[2])
- elif t == token.MINUS:
- return UnarySub(node, lineno = elt[2])
- elif t == token.TILDE:
- node = Invert(node, lineno = elt[2])
-
- return node
-
-
- def power(self, nodelist):
- node = self.com_node(nodelist[0])
- for i in range(1, len(nodelist)):
- elt = nodelist[i]
- if elt[0] == token.DOUBLESTAR:
- return Power([
- node,
- self.com_node(nodelist[i + 1])], lineno = elt[2])
-
- node = self.com_apply_trailer(node, elt)
-
- return node
-
-
- def atom(self, nodelist):
- return self._atom_dispatch[nodelist[0][0]](nodelist)
- n.lineno = nodelist[0][2]
- return n
-
-
- def atom_lpar(self, nodelist):
- if nodelist[1][0] == token.RPAR:
- return Tuple(())
-
- return self.com_node(nodelist[1])
-
-
- def atom_lsqb(self, nodelist):
- if nodelist[1][0] == token.RSQB:
- return List(())
-
- return self.com_list_constructor(nodelist[1])
-
-
- def atom_lbrace(self, nodelist):
- if nodelist[1][0] == token.RBRACE:
- return Dict(())
-
- return self.com_dictmaker(nodelist[1])
-
-
- def atom_backquote(self, nodelist):
- return Backquote(self.com_node(nodelist[1]))
-
-
- def atom_number(self, nodelist):
- k = eval(nodelist[0][1])
- return Const(k, lineno = nodelist[0][2])
-
-
- def decode_literal(self, lit):
- if self.encoding:
- if self.encoding not in [
- 'utf-8',
- 'iso-8859-1']:
- lit = unicode(lit, 'utf-8').encode(self.encoding)
-
- return eval('# coding: %s\n%s' % (self.encoding, lit))
- else:
- return eval(lit)
-
-
- def atom_string(self, nodelist):
- k = ''
- for node in nodelist:
- k += self.decode_literal(node[1])
-
- return Const(k, lineno = nodelist[0][2])
-
-
- def atom_name(self, nodelist):
- return Name(nodelist[0][1], lineno = nodelist[0][2])
-
-
- def lookup_node(self, node):
- return self._dispatch[node[0]]
-
- _callers = { }
-
- def com_node(self, node):
- return self._dispatch[node[0]](node[1:])
-
-
- def com_NEWLINE(self, *args):
- return Discard(Const(None))
-
-
- def com_arglist(self, nodelist):
- names = []
- defaults = []
- flags = 0
- i = 0
- while i < len(nodelist):
- node = nodelist[i]
- if node[0] == token.STAR or node[0] == token.DOUBLESTAR:
- if node[0] == token.STAR:
- node = nodelist[i + 1]
- if node[0] == token.NAME:
- names.append(node[1])
- flags = flags | CO_VARARGS
- i = i + 3
-
-
- if i < len(nodelist):
- t = nodelist[i][0]
- if t == token.DOUBLESTAR:
- node = nodelist[i + 1]
- else:
- raise ValueError, 'unexpected token: %s' % t
- names.append(node[1])
- flags = flags | CO_VARKEYWORDS
-
- break
-
- names.append(self.com_fpdef(node))
- i = i + 1
- if i >= len(nodelist):
- break
-
- if nodelist[i][0] == token.EQUAL:
- defaults.append(self.com_node(nodelist[i + 1]))
- i = i + 2
- elif len(defaults):
- defaults.append(Const(None))
-
- i = i + 1
- return (names, defaults, flags)
-
-
- def com_fpdef(self, node):
- if node[1][0] == token.LPAR:
- return self.com_fplist(node[2])
-
- return node[1][1]
-
-
- def com_fplist(self, node):
- if len(node) == 2:
- return self.com_fpdef(node[1])
-
- list = []
- for i in range(1, len(node), 2):
- list.append(self.com_fpdef(node[i]))
-
- return tuple(list)
-
-
- def com_dotted_name(self, node):
- name = ''
- for n in node:
- if type(n) == type(()) and n[0] == 1:
- name = name + n[1] + '.'
- continue
-
- return name[:-1]
-
-
- def com_dotted_as_name(self, node):
- if not node[0] == symbol.dotted_as_name:
- raise AssertionError
- node = node[1:]
- dot = self.com_dotted_name(node[0][1:])
- if len(node) == 1:
- return (dot, None)
-
- if not node[1][1] == 'as':
- raise AssertionError
- if not node[2][0] == token.NAME:
- raise AssertionError
- return (dot, node[2][1])
-
-
- def com_dotted_as_names(self, node):
- if not node[0] == symbol.dotted_as_names:
- raise AssertionError
- node = node[1:]
- names = [
- self.com_dotted_as_name(node[0])]
- for i in range(2, len(node), 2):
- names.append(self.com_dotted_as_name(node[i]))
-
- return names
-
-
- def com_import_as_name(self, node):
- if not node[0] == symbol.import_as_name:
- raise AssertionError
- node = node[1:]
- if not node[0][0] == token.NAME:
- raise AssertionError
- if len(node) == 1:
- return (node[0][1], None)
-
- if not node[1][1] == 'as':
- raise AssertionError, node
- if not node[2][0] == token.NAME:
- raise AssertionError
- return (node[0][1], node[2][1])
-
-
- def com_import_as_names(self, node):
- if not node[0] == symbol.import_as_names:
- raise AssertionError
- node = node[1:]
- names = [
- self.com_import_as_name(node[0])]
- for i in range(2, len(node), 2):
- names.append(self.com_import_as_name(node[i]))
-
- return names
-
-
- def com_bases(self, node):
- bases = []
- for i in range(1, len(node), 2):
- bases.append(self.com_node(node[i]))
-
- return bases
-
-
- def com_try_finally(self, nodelist):
- return TryFinally(self.com_node(nodelist[2]), self.com_node(nodelist[5]), lineno = nodelist[0][2])
-
-
- def com_try_except(self, nodelist):
- stmt = self.com_node(nodelist[2])
- clauses = []
- elseNode = None
- for i in range(3, len(nodelist), 3):
- node = nodelist[i]
- if node[0] == symbol.except_clause:
- if len(node) > 2:
- expr1 = self.com_node(node[2])
- if len(node) > 4:
- expr2 = self.com_assign(node[4], OP_ASSIGN)
- else:
- expr2 = None
- else:
- expr1 = None
- expr2 = None
- clauses.append((expr1, expr2, self.com_node(nodelist[i + 2])))
-
- if node[0] == token.NAME:
- elseNode = self.com_node(nodelist[i + 2])
- continue
-
- return TryExcept(self.com_node(nodelist[2]), clauses, elseNode, lineno = nodelist[0][2])
-
-
- def com_augassign_op(self, node):
- if not node[0] == symbol.augassign:
- raise AssertionError
- return node[1]
-
-
- def com_augassign(self, node):
- '''Return node suitable for lvalue of augmented assignment
-
- Names, slices, and attributes are the only allowable nodes.
- '''
- l = self.com_node(node)
- if l.__class__ in (Name, Slice, Subscript, Getattr):
- return l
-
- raise SyntaxError, "can't assign to %s" % l.__class__.__name__
-
-
- def com_assign(self, node, assigning):
- while None:
- t = node[0]
- if t == symbol.exprlist and t == symbol.testlist or t == symbol.testlist_gexp:
- if len(node) > 2:
- return self.com_assign_tuple(node, assigning)
-
- node = node[1]
- continue
- if t in _assign_types:
- if len(node) > 2:
- raise SyntaxError, "can't assign to operator"
-
- node = node[1]
- continue
- if t == symbol.power:
- if node[1][0] != symbol.atom:
- raise SyntaxError, "can't assign to operator"
-
- if len(node) > 2:
- primary = self.com_node(node[1])
- for i in range(2, len(node) - 1):
- ch = node[i]
- if ch[0] == token.DOUBLESTAR:
- raise SyntaxError, "can't assign to operator"
-
- primary = self.com_apply_trailer(primary, ch)
-
- return self.com_assign_trailer(primary, node[-1], assigning)
-
- node = node[1]
- continue
- if t == symbol.atom:
- t = node[1][0]
- if t == token.LPAR:
- node = node[2]
- if node[0] == token.RPAR:
- raise SyntaxError, "can't assign to ()"
-
- elif t == token.LSQB:
- node = node[2]
- if node[0] == token.RSQB:
- raise SyntaxError, "can't assign to []"
-
- return self.com_assign_list(node, assigning)
- elif t == token.NAME:
- return self.com_assign_name(node[1], assigning)
- else:
- raise SyntaxError, "can't assign to literal"
- t == token.LPAR
- raise SyntaxError, 'bad assignment'
-
-
- def com_assign_tuple(self, node, assigning):
- assigns = []
- for i in range(1, len(node), 2):
- assigns.append(self.com_assign(node[i], assigning))
-
- return AssTuple(assigns, lineno = extractLineNo(node))
-
-
- def com_assign_list(self, node, assigning):
- assigns = []
- for i in range(1, len(node), 2):
- if i + 1 < len(node):
- if node[i + 1][0] == symbol.list_for:
- raise SyntaxError, "can't assign to list comprehension"
-
- if not node[i + 1][0] == token.COMMA:
- raise AssertionError, node[i + 1]
-
- assigns.append(self.com_assign(node[i], assigning))
-
- return AssList(assigns, lineno = extractLineNo(node))
-
-
- def com_assign_name(self, node, assigning):
- return AssName(node[1], assigning, lineno = node[2])
-
-
- def com_assign_trailer(self, primary, node, assigning):
- t = node[1][0]
- if t == token.DOT:
- return self.com_assign_attr(primary, node[2], assigning)
-
- if t == token.LSQB:
- return self.com_subscriptlist(primary, node[2], assigning)
-
- if t == token.LPAR:
- raise SyntaxError, "can't assign to function call"
-
- raise SyntaxError, 'unknown trailer type: %s' % t
-
-
- def com_assign_attr(self, primary, node, assigning):
- return AssAttr(primary, node[1], assigning, lineno = node[-1])
-
-
- def com_binary(self, constructor, nodelist):
- """Compile 'NODE (OP NODE)*' into (type, [ node1, ..., nodeN ])."""
- l = len(nodelist)
- if l == 1:
- n = nodelist[0]
- return self.lookup_node(n)(n[1:])
-
- items = []
- for i in range(0, l, 2):
- n = nodelist[i]
- items.append(self.lookup_node(n)(n[1:]))
-
- return constructor(items, lineno = extractLineNo(nodelist))
-
-
- def com_stmt(self, node):
- result = self.lookup_node(node)(node[1:])
- if not result is not None:
- raise AssertionError
- if isinstance(result, Stmt):
- return result
-
- return Stmt([
- result])
-
-
- def com_append_stmt(self, stmts, node):
- result = self.lookup_node(node)(node[1:])
- if not result is not None:
- raise AssertionError
- if isinstance(result, Stmt):
- stmts.extend(result.nodes)
- else:
- stmts.append(result)
-
- if hasattr(symbol, 'list_for'):
-
- def com_list_constructor(self, nodelist):
- values = []
- for i in range(1, len(nodelist)):
- if nodelist[i][0] == symbol.list_for:
- if not len(nodelist[i:]) == 1:
- raise AssertionError
- return self.com_list_comprehension(values[0], nodelist[i])
- elif nodelist[i][0] == token.COMMA:
- continue
-
- values.append(self.com_node(nodelist[i]))
-
- return List(values, lineno = values[0].lineno)
-
-
- def com_list_comprehension(self, expr, node):
- lineno = node[1][2]
- fors = []
- while node:
- t = node[1][1]
- if t == 'for':
- assignNode = self.com_assign(node[2], OP_ASSIGN)
- listNode = self.com_node(node[4])
- newfor = ListCompFor(assignNode, listNode, [])
- newfor.lineno = node[1][2]
- fors.append(newfor)
- if len(node) == 5:
- node = None
- else:
- node = self.com_list_iter(node[5])
- len(node) == 5
- if t == 'if':
- test = self.com_node(node[2])
- newif = ListCompIf(test, lineno = node[1][2])
- newfor.ifs.append(newif)
- if len(node) == 3:
- node = None
- else:
- node = self.com_list_iter(node[3])
- len(node) == 3
- raise SyntaxError, 'unexpected list comprehension element: %s %d' % (node, lineno)
- return ListComp(expr, fors, lineno = lineno)
-
-
- def com_list_iter(self, node):
- if not node[0] == symbol.list_iter:
- raise AssertionError
- return node[1]
-
- else:
-
- def com_list_constructor(self, nodelist):
- values = []
- for i in range(1, len(nodelist), 2):
- values.append(self.com_node(nodelist[i]))
-
- return List(values)
-
- if hasattr(symbol, 'gen_for'):
-
- def com_generator_expression(self, expr, node):
- lineno = node[1][2]
- fors = []
- while node:
- t = node[1][1]
- if t == 'for':
- assignNode = self.com_assign(node[2], OP_ASSIGN)
- genNode = self.com_node(node[4])
- newfor = GenExprFor(assignNode, genNode, [], lineno = node[1][2])
- fors.append(newfor)
- if len(node) == 5:
- node = None
- else:
- node = self.com_gen_iter(node[5])
- len(node) == 5
- if t == 'if':
- test = self.com_node(node[2])
- newif = GenExprIf(test, lineno = node[1][2])
- newfor.ifs.append(newif)
- if len(node) == 3:
- node = None
- else:
- node = self.com_gen_iter(node[3])
- len(node) == 3
- raise SyntaxError, 'unexpected generator expression element: %s %d' % (node, lineno)
- fors[0].is_outmost = True
- return GenExpr(GenExprInner(expr, fors), lineno = lineno)
-
-
- def com_gen_iter(self, node):
- if not node[0] == symbol.gen_iter:
- raise AssertionError
- return node[1]
-
-
-
- def com_dictmaker(self, nodelist):
- items = []
- for i in range(1, len(nodelist), 4):
- items.append((self.com_node(nodelist[i]), self.com_node(nodelist[i + 2])))
-
- return Dict(items)
-
-
- def com_apply_trailer(self, primaryNode, nodelist):
- t = nodelist[1][0]
- if t == token.LPAR:
- return self.com_call_function(primaryNode, nodelist[2])
-
- if t == token.DOT:
- return self.com_select_member(primaryNode, nodelist[2])
-
- if t == token.LSQB:
- return self.com_subscriptlist(primaryNode, nodelist[2], OP_APPLY)
-
- raise SyntaxError, 'unknown node type: %s' % t
-
-
- def com_select_member(self, primaryNode, nodelist):
- if nodelist[0] != token.NAME:
- raise SyntaxError, 'member must be a name'
-
- return Getattr(primaryNode, nodelist[1], lineno = nodelist[2])
-
-
- def com_call_function(self, primaryNode, nodelist):
- if nodelist[0] == token.RPAR:
- return CallFunc(primaryNode, [], lineno = extractLineNo(nodelist))
-
- args = []
- kw = 0
- len_nodelist = len(nodelist)
- for i in range(1, len_nodelist, 2):
- node = nodelist[i]
- if node[0] == token.STAR or node[0] == token.DOUBLESTAR:
- break
-
- (kw, result) = self.com_argument(node, kw)
- if len_nodelist != 2 and isinstance(result, GenExpr) and len(node) == 3 and node[2][0] == symbol.gen_for:
- raise SyntaxError, 'generator expression needs parenthesis'
-
- args.append(result)
- else:
- i = i + 1
- if i < len_nodelist and nodelist[i][0] == token.COMMA:
- i = i + 1
-
- star_node = None
- dstar_node = None
- while i < len_nodelist:
- tok = nodelist[i]
- ch = nodelist[i + 1]
- i = i + 3
- if tok[0] == token.STAR:
- if star_node is not None:
- raise SyntaxError, 'already have the varargs indentifier'
-
- star_node = self.com_node(ch)
- continue
- if tok[0] == token.DOUBLESTAR:
- if dstar_node is not None:
- raise SyntaxError, 'already have the kwargs indentifier'
-
- dstar_node = self.com_node(ch)
- continue
- raise SyntaxError, 'unknown node type: %s' % tok
- return CallFunc(primaryNode, args, star_node, dstar_node, lineno = extractLineNo(nodelist))
-
-
- def com_argument(self, nodelist, kw):
- if len(nodelist) == 3 and nodelist[2][0] == symbol.gen_for:
- test = self.com_node(nodelist[1])
- return (0, self.com_generator_expression(test, nodelist[2]))
-
- if len(nodelist) == 2:
- if kw:
- raise SyntaxError, 'non-keyword arg after keyword arg'
-
- return (0, self.com_node(nodelist[1]))
-
- result = self.com_node(nodelist[3])
- n = nodelist[1]
- while len(n) == 2 and n[0] != token.NAME:
- n = n[1]
- if n[0] != token.NAME:
- raise SyntaxError, "keyword can't be an expression (%s)" % n[0]
-
- node = Keyword(n[1], result, lineno = n[2])
- return (1, node)
-
-
- def com_subscriptlist(self, primary, nodelist, assigning):
- if len(nodelist) == 2:
- sub = nodelist[1]
- if (sub[1][0] == token.COLON or len(sub) > 2 or sub[2][0] == token.COLON) and sub[-1][0] != symbol.sliceop:
- return self.com_slice(primary, sub, assigning)
-
-
- subscripts = []
- for i in range(1, len(nodelist), 2):
- subscripts.append(self.com_subscript(nodelist[i]))
-
- return Subscript(primary, assigning, subscripts, lineno = extractLineNo(nodelist))
-
-
- def com_subscript(self, node):
- ch = node[1]
- t = ch[0]
- if t == token.DOT and node[2][0] == token.DOT:
- return Ellipsis()
-
- if t == token.COLON or len(node) > 2:
- return self.com_sliceobj(node)
-
- return self.com_node(ch)
-
-
- def com_sliceobj(self, node):
- items = []
- if node[1][0] == token.COLON:
- items.append(Const(None))
- i = 2
- else:
- items.append(self.com_node(node[1]))
- i = 3
- if i < len(node) and node[i][0] == symbol.test:
- items.append(self.com_node(node[i]))
- i = i + 1
- else:
- items.append(Const(None))
- for j in range(i, len(node)):
- ch = node[j]
- if len(ch) == 2:
- items.append(Const(None))
- continue
- items.append(self.com_node(ch[2]))
-
- return Sliceobj(items, lineno = extractLineNo(node))
-
-
- def com_slice(self, primary, node, assigning):
- lower = None
- upper = None
- if len(node) == 3:
- if node[1][0] == token.COLON:
- upper = self.com_node(node[2])
- else:
- lower = self.com_node(node[1])
- elif len(node) == 4:
- lower = self.com_node(node[1])
- upper = self.com_node(node[3])
-
- return Slice(primary, assigning, lower, upper, lineno = extractLineNo(node))
-
-
- def get_docstring(self, node, n = None):
- if n is None:
- n = node[0]
- node = node[1:]
-
- if n == symbol.suite:
- if len(node) == 1:
- return self.get_docstring(node[0])
-
- for sub in node:
- if sub[0] == symbol.stmt:
- return self.get_docstring(sub)
- continue
-
- return None
-
- if n == symbol.file_input:
- for sub in node:
- if sub[0] == symbol.stmt:
- return self.get_docstring(sub)
- continue
-
- return None
-
- if n == symbol.atom:
- if node[0][0] == token.STRING:
- s = ''
- for t in node:
- s = s + eval(t[1])
-
- return s
-
- return None
-
- if n == symbol.stmt and n == symbol.simple_stmt or n == symbol.small_stmt:
- return self.get_docstring(node[0])
-
- if n in _doc_nodes and len(node) == 1:
- return self.get_docstring(node[0])
-
-
-
- _doc_nodes = [
- symbol.expr_stmt,
- symbol.testlist,
- symbol.testlist_safe,
- symbol.test,
- symbol.and_test,
- symbol.not_test,
- symbol.comparison,
- symbol.expr,
- symbol.xor_expr,
- symbol.and_expr,
- symbol.shift_expr,
- symbol.arith_expr,
- symbol.term,
- symbol.factor,
- symbol.power]
- _cmp_types = {
- token.LESS: '<',
- token.GREATER: '>',
- token.EQEQUAL: '==',
- token.EQUAL: '==',
- token.LESSEQUAL: '<=',
- token.GREATEREQUAL: '>=',
- token.NOTEQUAL: '!=' }
- _legal_node_types = [
- symbol.funcdef,
- symbol.classdef,
- symbol.stmt,
- symbol.small_stmt,
- symbol.flow_stmt,
- symbol.simple_stmt,
- symbol.compound_stmt,
- symbol.expr_stmt,
- symbol.print_stmt,
- symbol.del_stmt,
- symbol.pass_stmt,
- symbol.break_stmt,
- symbol.continue_stmt,
- symbol.return_stmt,
- symbol.raise_stmt,
- symbol.import_stmt,
- symbol.global_stmt,
- symbol.exec_stmt,
- symbol.assert_stmt,
- symbol.if_stmt,
- symbol.while_stmt,
- symbol.for_stmt,
- symbol.try_stmt,
- symbol.suite,
- symbol.testlist,
- symbol.testlist_safe,
- symbol.test,
- symbol.and_test,
- symbol.not_test,
- symbol.comparison,
- symbol.exprlist,
- symbol.expr,
- symbol.xor_expr,
- symbol.and_expr,
- symbol.shift_expr,
- symbol.arith_expr,
- symbol.term,
- symbol.factor,
- symbol.power,
- symbol.atom]
- if hasattr(symbol, 'yield_stmt'):
- _legal_node_types.append(symbol.yield_stmt)
-
- _assign_types = [
- symbol.test,
- symbol.and_test,
- symbol.not_test,
- symbol.comparison,
- symbol.expr,
- symbol.xor_expr,
- symbol.and_expr,
- symbol.shift_expr,
- symbol.arith_expr,
- symbol.term,
- symbol.factor]
- import types
- _names = { }
- for k, v in symbol.sym_name.items():
- _names[k] = v
-
- for k, v in token.tok_name.items():
- _names[k] = v
-
-
- def debug_tree(tree):
- l = []
- for elt in tree:
- if type(elt) == types.IntType:
- l.append(_names.get(elt, elt))
- continue
- if type(elt) == types.StringType:
- l.append(elt)
- continue
- l.append(debug_tree(elt))
-
- return l
-
-